CVE-2019-17564:Apache Dubbo反序列化漏洞分析


前几天360发了一则Apache Dubbo的漏洞预警,@hu3sky师傅让我帮他看看这个漏洞复现的问题。Burp打二进制的反序列化数据有一点bug,这里记录一下解决的过程。

环境搭建

1
2
git clone https://github.com/apache/dubbo-samples.git
cd dubbo-samples/java/dubbo-samples-http

修改/dubbo-samples/java/dubbo-samples-http/pom.xml

1
2
3
4
5
6
<properties>
<source.level>1.8</source.level>
<target.level>1.8</target.level>
<!--修改版本为2.7.3-->
<dubbo.version>2.7.3</dubbo.version>
...

再加一个dependency,作为gadget:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>

然后 mvn clean package
接着 mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.http.HttpProvider exec:java

或者扔进idea里,配一个-Djava.net.preferIPv4Stack=true参数
-w607

还要配一个zookeeper:
zookeeper-3.4.14.ta

执行bin/zkServer.sh,如果提示no such file zoo.cfg,在conf目录下把zoo-sample.cfg改成zoo.cfg,然后继续执行即可。

漏洞复现

踩了一堆坑,yso生成的反序列化数据,直接贴进burp是有蜜汁bug的,最后的解决办法有两种:

漏洞分析

在dispatch文件处理http路由分发,/org/apache/dubbo/remoting/http/servlet/DispatcherServlet.java
-w1157

跟进handle函数:/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java
-w1234
判断是否为post请求,然后继续处理Request:/org/springframework/remoting/httpinvoker/HttpInvokerServiceExporter.class
-w1250
将request的post输入传入:
-w1379

最后在/org/springframework/remoting/rmi/RemoteInvocationSerializingExporter.class, 调用readObject()
-w1510

调用栈:
-w679

最后

一个sample环境的反序列化,要结合其他组件才能利用,个人感觉危害面不是很大。
新版的修复策略,在处理路由的handle函数,使用了另外一个组件,且在处理非json数据的时候会抛出异常。
-w1526